use napi_derive_ohos::napi;

/// 表示地理位置信息的数据结构（纬度、经度）
/// 注意：因为 napi-ohos 不支持结构体自动转换，我们通过分别传入纬度和经度的方式处理
#[napi]
pub fn calculate_distance_km(
    lat1: f64,
    lon1: f64,
    lat2: f64,
    lon2: f64,
) -> f64 {
    let pos1 = GeoPosition {
        latitude: lat1,
        longitude: lon1,
    };
    let pos2 = GeoPosition {
        latitude: lat2,
        longitude: lon2,
    };
    calculate_distance(&pos1, &pos2)
}

/// 内部使用的地理位置结构体（不导出到 JS 层）
struct GeoPosition {
    latitude: f64,
    longitude: f64,
}

/// 计算两点之间的球面距离，单位为千米（使用 Haversine 公式）
fn calculate_distance(pos1: &GeoPosition, pos2: &GeoPosition) -> f64 {
    let lat1_rad = pos1.latitude.to_radians();
    let lat2_rad = pos2.latitude.to_radians();
    let delta_lat_rad = (pos2.latitude - pos1.latitude).to_radians();
    let delta_lon_rad = (pos2.longitude - pos1.longitude).to_radians();

    let a = (delta_lat_rad / 2.0).sin().powi(2)
        + lat1_rad.cos() * lat2_rad.cos() * (delta_lon_rad / 2.0).sin().powi(2);

    let c = 2.0 * a.sqrt().atan2((1.0 - a).sqrt());

    // 地球半径约为 6371 公里
    6371.0 * c
}

